Laboratorio 6: La desperación de Mr. Lepin 🐼

MDS7202: Laboratorio de Programación Científica para Ciencia de Datos

Cuerpo Docente:

Equipo: SUPER IMPORTANTE - notebooks sin nombre no serán revisados

Indice

  1. Temas a tratar
  2. Descripcción del laboratorio
  3. Desarrollo

Temas a tratar

Reglas:

Objetivos principales del laboratorio

El laboratorio deberá ser desarrollado sin el uso indiscriminado de iteradores nativos de python (aka "for", "while"). La idea es que aprendan a exprimir al máximo las funciones optimizadas que nos entrega numpy, las cuales vale mencionar, son bastante más eficientes que los iteradores nativos sobre arreglos (o tensores).

Descripción del laboratorio.

Importamos librerias utiles 😸

Segmentación de Clientes en Tienda de Retail 🛍️

1.1 Cargar Dataset

Mr. Lepin, en una nueva reunión, le cuenta a ud y su equipo que los resultados derivados del análisis exploratorio de dato presentaron una gran utilidad para la empresa y que tiene un gran entusiasmo por continuar trabajando con ustedes. Es por esto, que Mr. Lepin les pide que cargue y visualicen algunas de las filas que componen el Dataset. A continuación un extracto de lo parlamentado en la reunión:

- Usted: Es un gran logro para nuestro equipo que usted haya encontrado excelente el EDA. ¿Qué tiene en mente ahora?
- Mr. Lepin: Resulta que hace algún tiempo, mientras tomaba un mojito en una reunión de gerentes en Panamá, oí a un *chato* acerca de **LRMFP**, que es un modelo que permite personificar a los clientes a través de la farbicación de distintos atributos que describen a los clientes. Lo encontré es-tu-pendo ñatito. 
- Usted: Ehh bueno. Investigaremos acerca de este modelo y veremos lo que podemos hacer.

Por ende, su siguiente tarea es calcular LRMFP sobre cada cliente y luego hacer un análisis de las características generadas. Para esto, el área de ventas les entrega un nuevo archivo llamado online_retail_II_cleaned.pickle, quien posee los datos del DataFrame original limpios y listos para obtener las características solicitadas por Mr. Lepin.

1.2 Creación de nuevas Caracteristicas [2 Puntos]

Como ya se les comento, Mr. Lepin esta interesado en obtener las características LRMFP, para esto les señala que estas características se construyen en base a las siguientes definiciones:

$$Periodicity(n)=std(IVT_1, ..., IVT_n)$$

         Donde $IVT$ denota el tiempo entre visitas y n representa el número de valores de tiempo entre visitas de un cliente.

$$IVT_i=date\_diff(t_{i+1},t)$$

En base a las definiciones señaladas, diseñe una función que permita obtener las características LRMFP recibiendo un DataFrame como entrada. Para esto, no estará permitido el uso de iteradores, utilice todas las herramientas que les ofrece pandas para realizar esto.

Una referencia que le puede ser útil es el documento original en donde se propone este método.

Nota: Para la $fechafinal$ utilice la fecha máxima del dataset más 1 día.

Ejemplo de Resultado Esperado:

Customer ID Length Recency Frequency Monetary Periodicity
12346.0 294 67 46 -64.68 37.0
12347.0 37 3 71 1323.32 0.0
12349.0 327 43 107 2646.99 78.0
12352.0 16 11 18 343.80 0.0
12356.0 44 16 84 3562.25 12.0

Respuesta:

A continuación se muestra la función para obtener las características LRMFP. Se agrupa en compras (boleta) y luego en clientes, esto se debe a que hay valores que deben ser obtenidos de la compra, como Monetary.

No se utilizan iteradores en el código

1.3 Pipelines 👷

Finalmente Don Mora le pregunta si seria posible realizar un pipeline para realizar una segmentación de los clientes con los nuevos datos generados, a lo que usted responde que y propone la utilización de k-means para la segmentación.

A continuación siga los pasos requeridos para obtener la segmentación de clientes.

1.3.1 Estandarizar Caracteristicas [0.5 puntos]

Construya una clase llamada MinMax() utilizando BaseEstimator y TransformerMixin para realizar una transformación de cada una de las columnas de un DataFrame utilizando ColumnTransformer() más tarde (tome como referencia el siguiente enlace).

Para esto considere que Min-Max escaler queda dada por la ecuación:

$$MinMax = \dfrac{x-min(x)}{max(x) - min(x)}$$

Con esto buscamos que los valores que componen a las columnas se muevan en el rango de valores $[0, 1]$.

Respuesta:

Se crea una función MinMax capáz de ajustarse y utilizarla. Además, se evitan errores en el código en el caso de dividir por cero.

1.3.2 T-SNA Pipeline [1.0 puntos]

Para comenzar introduciéndose en el uso de pipeline, decide probar realizando un pipeline enfocado en la reducción de dimensionalidad y así hacer no decepcionar a Mr. Lepin con la clusterización del modelo.

Configure un pipeline utilizando el algoritmo T-SNE sobre los datos LRMFP, donde, para la realización del pipeline considera los siguientes pasos:

  1. Como primer paso obtenga las características LRMFP desde el DataFrame df_retail_II_cleaned.pickle utilizando la función custom_features creada anteriormente, junto a FunctionTransformer(). Considere esto como el primer paso de su pipeline.
  2. En segundo lugar usando ColumnTransformer() aplique el MinxMax scaler creado por usted sobre todas las columnas generadas en el paso anterior.
  3. Finalmente, aplique un último paso donde obtiene las 2 componentes más relevantes utilizando el algoritmo T-sne de sckit-learn.

Tras aplicar las transformaciones sobre el dataset LRMFP, gráfique las componentes obtenidas en la reducción de dimensionalidad.

Respuesta:

1.3.3 Clustering

1.3.3.1 Método del Codo [1 puntos]

Utilizando la clase creada para escalamiento, aplique el método del codo para visualizar cual es el número de clusters que mejor se ajustan a los datos. Realice esto utilizando el algoritmo K-means dentro de un pipeline para un $k \in [1,20]$, donde k representa el número de clusters del k-means. Para la realización de esta sección y la próxima (1.3.3.2), considere los mismos pasos utilizados para el t-sne, pero permutando el algoritmo de reducción de dimensionalidad por k-means.

A través del grafico obtenido, comente y justifique que valor de k escogería para realizar el k-means.

Respuesta:

Siguiendo el "método de codo", se busca un punto de inflexión de la curva de errores vs número de clusters. El punto escogido corresponde a n° clusters = 4.

Tal como se puede apreciar en el gráfico, en el punto seleccionado ocurre un cambio brusco, "codo", lo cual indica que es un punto que minimiza tanto el error como el número de clusters.

1.3.3.2 Segmentación de Clientes con K-Means 🎁 [1 punto]

En base a la elección de k realizada en la sección anterior, utilice este valor escogido y entrene un modelo de K-means utilizando el mismo pipeline de scikit-learn utilizado anteriormente.

Una vez ajustado los datos, genere una tabla con los promedios (o medianas) para cada uno de los atributos, agrupando estos por el clúster que pertenecen. ¿Es posible observar agrupaciones coherentes?, ¿Qué tipo de clientes posee el retail?, Justifique su respuesta y no decepcione a Mr. Lepin.

Respuesta:

¿Es posible observar agrupaciones coherentes?

Si, es posible observar agrupaciones coherentes. Se puede ver claramente como cada cluster tiene caracteristicas, o combinaciones de caracteristicas que los otros no tienen. En cada columna destaca uno o dos clusters.

¿Qué tipo de clientes posee el retail?

Cluster 0: Solo compró algunas veces en un periodo corto de tiempo. Cuando compró fue hace poco tiempo. Podemos describirlo como un "nuevo cliente". Dentro de este conjunto podrían haber futuros "clientes furtivos"

Cluster 1: Va periodicamente con una frecuencia alta. Podríamos describirlo como un "cliente frecuente"

Cluster 2: Solo compró algunas veces en un periodo corto de tiempo. Las compras no fueron recientes, así que podemos asumir que fue una compra futiva. Podemos describirlo como un "cliente furtivo".

Cluster 3: Va periodicamente pero con un periodo extenso. Podríamos describirlo como un "cliente mensual"

A modo de resumen, se tiene la siguiente descripción de cliente.

Respuesta Esperada:

Length Recency Frequency Monetary Periodicity
Cluster
0 258.8 45.2 76.1 1107.7 107.6 449
1 76.1 217.6 45.5 791.7 14.1 466
2 368.5 4.8 2715.0 226621.6 4.2 4
3 85.3 45.7 65.8 1047.0 10.5 987
4 347.2 15.9 1658.0 35829.3 8.0 25
5 298.0 29.8 183.8 3639.9 32.0 1188

1.3.3.3 Plot de K-Means 📈 [0.5 puntos]

Por último, Mr. Lepin, impaciente de no entender lo que usted intenta explicarle, le solicita que por favor muestre algún resultado "visual" de los grupos encontrados.

Para esto, grafique nuevamente las características encontradas usando T-SNE (no calcule de nuevo, simplemente utilice las proyecciones encontradas) y agregue las labels calculadas con kmeans como el argumento color.

Comente: ¿Se separan bien los distintos clusters en la visualización?

Respuesta:

¿Se separan bien los distintos clusters en la visualización?

Se puede ver como se separan los conjuntos en grupos. Cada cluster está separado de los otros, lo que muestra que el clustering fue hecho de forma eficiente.

Se puede apreciar que el cliente mensual está en el centro. Esta debe ser la clase más dificil de diferenciar de las otras pues comparte comportamientos con todos.

Se puede apreciar como los clientes furtivos y nuevos se separan de los clientes mensuales y frecuentes. Esto tiene sentido, pues estos pares tienen similares la frecuencia, periodicidad y fidelidad en el tiempo.

Conclusión

Eso ha sido todo para el lab de hoy, recuerden que el laboratorio tiene un plazo de entrega de una semana y que los días de atraso no se pueden utilizar para entregas de lab solo para tareas. Cualquier duda del laboratorio, no duden en contactarnos por mail o U-cursos.

Gracias Totales!



Created in deepnote.com Created in Deepnote